/**
 * 认识异常
 * java中不同类型的异常，都有对应的类来描述
 * 异常的体系结构：
 * Throwable是顶层类，派生出两个子类 Error Exception
 * Error 指的是Java虚拟机无法解决的问题 典型代表为StackOverflow
 * Exception 异常产生和程序员可以通过代码处理
 * 异常分为两种
 * 1.程序编译期间发生的异常，称为编译时异常，也叫受检查异常
 * 2.程序执行期间发生的异常，称为运行时异常，也叫非受检查异常
 * 注意编译时出现的语法性错误，不能称之为异常。例如将 System.out.println 拼写错了, 写成了
 * system.out.println. 此时编译过程中就会出错, 这是 "编译期" 出错。而运行时指的是程序已经编译通过得到
 * class 文件了, 再由 JVM 执行过程中出现的错误
 */

/**
 * java中 异常处理主要需要五个关键字 throw try catch final throws
 * 1.throw 抛出一个指定的异常对象，将错误信息告知给调用者
 * throw new XXXException("异常产生原因");
 */
//public class Test {
//    public static int getElement(int[] array, int index){
//        if (null == array){
//            throw new NullPointerException("传递的数组为null");
//        }
//        if (index < 0 || index >= array.length){
//            throw new ArrayIndexOutOfBoundsException("数组下标越界");
//        }
//        return array[index];
//    }
//
//    public static void main(String[] args) {
//        int[] arr = {1,2,3,4};
//        System.out.println(getElement(null, 5));
//    }
//}



/**
 * 1.throw必须写在方法的内部
 * 2.抛出的对象必须是Exception或者其子类
 * 3.异常一旦抛出，其后面的代码就不会执行
 */

//异常的捕获
//也就是异常的具体处理方式： 1. 异常声明 throws 2.try - catch捕获处理

//1.异常声明throws
//位于方法声明参数列表之后，在方法中抛出编译医生，用户不想处理该异常，借助throws将异常
//抛给调用者来处理
//throws可以抛出多个异常，异常之间用逗号隔开即可

//try - catch捕获
//try{
//   // 将可能出现异常的代码放在这里
//}catch(要捕获的异常类型  e){
//      // 如果try中的代码抛出异常了，此处catch捕获时异常类型与try中抛出的异常类型一致时，或者是try中抛出异常的基类
//时，就会被捕获到
//      // 对异常就可以正常处理，处理完成后，跳出try-catch结构，继续执行后序代码
//}catch(异常类型 e){
//     // 对异常进行处理
//}finally{
//       // 此处代码一定会被执行到
//}
//后续代码：如果异常被捕获到了，那么就异常会被处理，后面的代码会执行
//如果一场没有被捕获到，或者捕获类型不对，那么后面的代码不会执行


//public class Test {
//    public static void main(String[] args) {
//        // 创建内部类的实例
//        ExceptionHandlingExample example = new ExceptionHandlingExample();
//        // 调用内部类的main方法，需要传入合适的参数（这里传入一个空数组，实际情况可能需要根据需求传入正确的参数）
//        example.fun();
//    }
//
//    public static class ExceptionHandlingExample {
//        public static void fun(){
//            try {
//                int result = divide(10, 0);
//                System.out.println("除法结果: " + result);
//            } catch (ArithmeticException e) {
//                System.out.println("捕获到算术异常: " + e.getMessage());
//            } finally {
//                System.out.println("这是 finally 块，无论是否发生异常都会执行。");
//            }
//            System.out.println("这是后序代码，在 try-catch-finally 结构之后执行。");
//        }
//
//        public static int divide(int dividend, int divisor) {
//            if (divisor == 0) {
//                throw new ArithmeticException("除数不能为零");
//            }
//            return dividend / divisor;
//        }
//    }
//}


//public class Test {
//    public static void main(String[] args) {
//        try {
//            int[] array = {1,2,3};
//            System.out.println(array[3]);
//        }catch (ArrayIndexOutOfBoundsException e){
//            e.getMessage();
//        }
//        System.out.println("后序代码");
//    }
//}

/**
 * 程序异常流程总结：
 * 1.程序先执行try中的代码
 * 2.try中代码出现异常，结束try中代码，看是否与catch中的异常类型匹配
 * 3.如果与catch中的类型匹配，则实行catch中的代码
 * 4.程序继续执行
 * 5.如果没有找到，异常向上传递
 * 6.不管找没找到，finally的代码一定会执行
 * 7.一只向上传到了main方法也没有合适的代码处理异常，则程序会异常终止
 */









